上一篇中我們完成了header的切版應用、介紹了錨點(Anchor)、還做了一點主頁面的切版:
那我們接續上一篇的內容,而當我們使用手機裝置打開此網頁,會發現 ──
這是因為,我們還沒有做好RWD的設定,所以今天我們會延續昨天的內容,以這個網頁做RWD的優化,下圖便是我們的最終成品:
成品連結
使用手機或其他非桌上電腦的裝置打開該網頁時,會發現所有的元件都擠在一起。為了方便我們編輯,我們最好還是一塊一塊拆開來編輯。
首先,我們要把除了header以外的元件程式碼都下註解取消功能,只留下一個乾淨的網站:
再來,我們要思考頁面的寬度到多少時,便要做變化。本篇的範例中,我希望該網頁在平板裝置上瀏覽時,header的menu就會發生變化。
所以在CSS文本內我會這樣寫:
@media (max-width:770px) {
/* 意指 當頁面尺寸小於770px發生改變 */
}
當頁面尺寸小於770px的時侯,我要將header的link藏起來,並且讓logo滿版,最後要跑出menu的選單。
要達成這些動作,我們要先編輯HTML的文本:
<header>
<div class="container header">
<!-- left -->
<div class="header-logo">
@ this is a logo
</div>
<!-- right -->
<div class="menu-link">
<a href="#page1">go page1</a>
<a href="#page2">go page2</a>
<a href="#page3">go page3</a>
<a href="#page4">go page4</a>
<a href="#page5">go page5</a>
</div>
<!-- 新增按鈕 -->
<button class="menu-btn">
button
</button>
</div>
</header>
我們menu button將套用Font Awesome的menu hamburger樣式。
Font Awesome的使用可以看這裡 ⇒ 【Day10】前端撰寫(7)CSS框架。
定義button的樣式:
在初始的網頁頁面中,我們希望此menu的button是隱藏的,所以要寫上 display:none
的屬性來隱藏。
.menu-btn {
color: white;
display: none;
}
當頁面尺寸小於770px時,該button便會顯示出來,且錨點的link區域要被隱藏。
@media (max-width:770px) {
.menu-btn {
display: block;
}
.menu-link {
display: none;
}
}
這裡呢,為了方便操作,我們可以先做link區域的切版,最後再把 display:none
的屬性打上去。
接下來我們要撰寫,menu-link在其他裝置上的樣式。
我們要把link區塊從menu中拉出來,所以我們要對menu-link下absolute。
而要使用absolute的屬性則必須對header下一個 position:relative
:
如果還是會搞混position的使用方法,可以參考這篇 ⇒ 【Day08】前端撰寫(5)CSS Position。
然後就可以設定,當頁面尺寸小於770px時,menu-link的position,這邊我們將其定位在header下方:
@media (max-width:770px) {
.menu-btn {
display: block;
}
.menu-link {
/* display: none; */
position: absolute;
top:100%;
background-color: #202020;
}
}
似乎不太美觀呢,使其滿版看看:
@media (max-width:770px) {
.menu-btn {
display: block;
}
.menu-link {
/* display: none; */
position: absolute;
top:100%;
background-color: #202020;
width: 100%;
}
}
好多了,接著繼續設定link的排版和間距設定:
@media (max-width:770px) {
.menu-btn {
display: block;
}
.menu-link {
/* display: none; */
position: absolute;
top:100%;
background-color: #202020;
width: 100%;
flex-direction: column;
}
.menu-link > a {
padding: 5% 2%;
font-size: 1.3rem;
}
}
上面的程式碼中,我們直接使用 flex-direction
的屬性,使其變為直排。
而我們之所以能直接下該屬性,是因為我們就在先前就已經設定好display:flex
了。
如此一來,小裝置的網頁header切版完成了。
但,總覺得還少了些甚麼? ── 原來是按鈕事件的處理!
我們要來開始撰寫Script了,同樣要先引入jQuery檔,詳情請參考 ⇒ 【Day12】讓網頁動起來(2)元老級插件jQuery!
const menuBtn = $('.menu-btn');
const menuLinks = $('.menu-link');
let menuOpen = false;
// menu點擊
menuBtn.click(function () {
if (menuOpen) {
// 隱藏
menuLinks.hide();
menuOpen = false;
} else {
// 顯示
menuLinks.css("display","flex");
menuOpen = true;
}
});
寫完腳本後,我們就可以靠點擊按鈕來開關menu了!
但是這種寫法會有一種bug ── 當我們改變視窗大小時,menu-link不一定會顯示出來,所以我們要偵測是否有改變大小的動作:
$(window).resize(function () {
if ($(window).width() > 770) {
menuLinks.css("display","flex");
menuOpen = false;
} else {
menuLinks.hide();
menuOpen = false;
}
});
如此一來,header的RWD便完成了!
最後,我們可以把網頁內的元件消註解,加回來,並慢慢執行優化:
@media (max-width:1080px) {
.home-page {
height: 95vh;
}
.home-title {
bottom: unset;
top: 10vh;
}
.home-img {
left: 50%;
top: 110%;
transform: translate(-50%,0) !important;
}
}
優化完成啦!如此一來,不論是在何種裝置瀏覽此網站都ok了!
成品連結
source code
今天的切版應用便到此結束,明天我們要來討論何謂前端的框架與React環境,這部分又會比切版還更加有難度喔!那,我們明天見!